/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package gmovil_jpa.controladores;

import gmovil_jpa.controladores.exceptions.NonexistentEntityException;
import gmovil_jpa.entidades.DetalleFacturaPlan;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import gmovil_jpa.entidades.TipoOperacionComercial;
import gmovil_jpa.entidades.Plan;
import gmovil_jpa.entidades.Factura;

/**
 *
 * @author castlerock
 */
public class DetalleFacturaPlanJpaController {

    public DetalleFacturaPlanJpaController() {
        emf = Persistence.createEntityManagerFactory("gmovil_jpaPU");
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(DetalleFacturaPlan detalleFacturaPlan) {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            TipoOperacionComercial tipoOperacionComercial = detalleFacturaPlan.getTipoOperacionComercial();
            if (tipoOperacionComercial != null) {
                tipoOperacionComercial = em.getReference(tipoOperacionComercial.getClass(), tipoOperacionComercial.getIdTipoOperacionComercial());
                detalleFacturaPlan.setTipoOperacionComercial(tipoOperacionComercial);
            }
            Plan plan = detalleFacturaPlan.getPlan();
            if (plan != null) {
                plan = em.getReference(plan.getClass(), plan.getIdPlan());
                detalleFacturaPlan.setPlan(plan);
            }
            Factura factura = detalleFacturaPlan.getFactura();
            if (factura != null) {
                factura = em.getReference(factura.getClass(), factura.getIdFactura());
                detalleFacturaPlan.setFactura(factura);
            }
            em.persist(detalleFacturaPlan);
            if (tipoOperacionComercial != null) {
                tipoOperacionComercial.getDetalleFacturaPlanList().add(detalleFacturaPlan);
                tipoOperacionComercial = em.merge(tipoOperacionComercial);
            }
            if (plan != null) {
                plan.getDetalleFacturaPlanList().add(detalleFacturaPlan);
                plan = em.merge(plan);
            }
            if (factura != null) {
                factura.getDetalleFacturaPlanList().add(detalleFacturaPlan);
                factura = em.merge(factura);
            }
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(DetalleFacturaPlan detalleFacturaPlan) throws NonexistentEntityException, Exception {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleFacturaPlan persistentDetalleFacturaPlan = em.find(DetalleFacturaPlan.class, detalleFacturaPlan.getIdDetalleFacturaPlan());
            TipoOperacionComercial tipoOperacionComercialOld = persistentDetalleFacturaPlan.getTipoOperacionComercial();
            TipoOperacionComercial tipoOperacionComercialNew = detalleFacturaPlan.getTipoOperacionComercial();
            Plan planOld = persistentDetalleFacturaPlan.getPlan();
            Plan planNew = detalleFacturaPlan.getPlan();
            Factura facturaOld = persistentDetalleFacturaPlan.getFactura();
            Factura facturaNew = detalleFacturaPlan.getFactura();
            if (tipoOperacionComercialNew != null) {
                tipoOperacionComercialNew = em.getReference(tipoOperacionComercialNew.getClass(), tipoOperacionComercialNew.getIdTipoOperacionComercial());
                detalleFacturaPlan.setTipoOperacionComercial(tipoOperacionComercialNew);
            }
            if (planNew != null) {
                planNew = em.getReference(planNew.getClass(), planNew.getIdPlan());
                detalleFacturaPlan.setPlan(planNew);
            }
            if (facturaNew != null) {
                facturaNew = em.getReference(facturaNew.getClass(), facturaNew.getIdFactura());
                detalleFacturaPlan.setFactura(facturaNew);
            }
            detalleFacturaPlan = em.merge(detalleFacturaPlan);
            if (tipoOperacionComercialOld != null && !tipoOperacionComercialOld.equals(tipoOperacionComercialNew)) {
                tipoOperacionComercialOld.getDetalleFacturaPlanList().remove(detalleFacturaPlan);
                tipoOperacionComercialOld = em.merge(tipoOperacionComercialOld);
            }
            if (tipoOperacionComercialNew != null && !tipoOperacionComercialNew.equals(tipoOperacionComercialOld)) {
                tipoOperacionComercialNew.getDetalleFacturaPlanList().add(detalleFacturaPlan);
                tipoOperacionComercialNew = em.merge(tipoOperacionComercialNew);
            }
            if (planOld != null && !planOld.equals(planNew)) {
                planOld.getDetalleFacturaPlanList().remove(detalleFacturaPlan);
                planOld = em.merge(planOld);
            }
            if (planNew != null && !planNew.equals(planOld)) {
                planNew.getDetalleFacturaPlanList().add(detalleFacturaPlan);
                planNew = em.merge(planNew);
            }
            if (facturaOld != null && !facturaOld.equals(facturaNew)) {
                facturaOld.getDetalleFacturaPlanList().remove(detalleFacturaPlan);
                facturaOld = em.merge(facturaOld);
            }
            if (facturaNew != null && !facturaNew.equals(facturaOld)) {
                facturaNew.getDetalleFacturaPlanList().add(detalleFacturaPlan);
                facturaNew = em.merge(facturaNew);
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                Integer id = detalleFacturaPlan.getIdDetalleFacturaPlan();
                if (findDetalleFacturaPlan(id) == null) {
                    throw new NonexistentEntityException("The detalleFacturaPlan with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(Integer id) throws NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            DetalleFacturaPlan detalleFacturaPlan;
            try {
                detalleFacturaPlan = em.getReference(DetalleFacturaPlan.class, id);
                detalleFacturaPlan.getIdDetalleFacturaPlan();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The detalleFacturaPlan with id " + id + " no longer exists.", enfe);
            }
            TipoOperacionComercial tipoOperacionComercial = detalleFacturaPlan.getTipoOperacionComercial();
            if (tipoOperacionComercial != null) {
                tipoOperacionComercial.getDetalleFacturaPlanList().remove(detalleFacturaPlan);
                tipoOperacionComercial = em.merge(tipoOperacionComercial);
            }
            Plan plan = detalleFacturaPlan.getPlan();
            if (plan != null) {
                plan.getDetalleFacturaPlanList().remove(detalleFacturaPlan);
                plan = em.merge(plan);
            }
            Factura factura = detalleFacturaPlan.getFactura();
            if (factura != null) {
                factura.getDetalleFacturaPlanList().remove(detalleFacturaPlan);
                factura = em.merge(factura);
            }
            em.remove(detalleFacturaPlan);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<DetalleFacturaPlan> findDetalleFacturaPlanEntities() {
        return findDetalleFacturaPlanEntities(true, -1, -1);
    }

    public List<DetalleFacturaPlan> findDetalleFacturaPlanEntities(int maxResults, int firstResult) {
        return findDetalleFacturaPlanEntities(false, maxResults, firstResult);
    }

    private List<DetalleFacturaPlan> findDetalleFacturaPlanEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(DetalleFacturaPlan.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public DetalleFacturaPlan findDetalleFacturaPlan(Integer id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(DetalleFacturaPlan.class, id);
        } finally {
            em.close();
        }
    }

    public int getDetalleFacturaPlanCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<DetalleFacturaPlan> rt = cq.from(DetalleFacturaPlan.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }

}
